/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.hadoop.hbase.master;

import static org.mockito.Mockito.mock;

import com.google.protobuf.Service;

import java.io.IOException;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hbase.ChoreService;
import org.apache.hadoop.hbase.CoordinatedStateManager;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableDescriptors;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.ClusterConnection;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.MasterSwitchType;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.executor.ExecutorService;
import org.apache.hadoop.hbase.favored.FavoredNodesManager;
import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
import org.apache.hadoop.hbase.master.locking.LockManager;
import org.apache.hadoop.hbase.master.normalizer.RegionNormalizer;
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
import org.apache.hadoop.hbase.master.replication.ReplicationPeerManager;
import org.apache.hadoop.hbase.master.snapshot.SnapshotManager;
import org.apache.hadoop.hbase.procedure.MasterProcedureManagerHost;
import org.apache.hadoop.hbase.procedure2.LockedResource;
import org.apache.hadoop.hbase.procedure2.Procedure;
import org.apache.hadoop.hbase.procedure2.ProcedureEvent;
import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.quotas.MasterQuotaManager;
import org.apache.hadoop.hbase.replication.ReplicationException;
import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;
import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;
import org.apache.hadoop.hbase.zookeeper.ZKWatcher;

public class MockNoopMasterServices implements MasterServices {

    private final Configuration conf;
    private final MetricsMaster metricsMaster;

    public MockNoopMasterServices() {
        this(null);
    }

    public MockNoopMasterServices(final Configuration conf) {
        this.conf = conf;
        this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(null));
    }

    @Override
    public void checkTableModifiable(TableName tableName) throws IOException {
        //no-op
    }

    @Override
    public long createTable(final TableDescriptor desc, final byte[][] splitKeys, final long nonceGroup, final long nonce) throws IOException {
        // no-op
        return -1;
    }

    @Override
    public long createSystemTable(final TableDescriptor tableDescriptor) throws IOException {
        return -1;
    }

    @Override
    public AssignmentManager getAssignmentManager() {
        return null;
    }

    @Override
    public ExecutorService getExecutorService() {
        return null;
    }

    @Override
    public ChoreService getChoreService() {
        return null;
    }

    @Override
    public RegionNormalizer getRegionNormalizer() {
        return null;
    }

    @Override
    public CatalogJanitor getCatalogJanitor() {
        return null;
    }

    @Override
    public MasterFileSystem getMasterFileSystem() {
        return null;
    }

    @Override
    public MasterWalManager getMasterWalManager() {
        return null;
    }

    @Override
    public MasterCoprocessorHost getMasterCoprocessorHost() {
        return null;
    }

    @Override
    public MasterQuotaManager getMasterQuotaManager() {
        return null;
    }

    @Override
    public ProcedureExecutor<MasterProcedureEnv> getMasterProcedureExecutor() {
        return null;
    }

    @Override
    public MetricsMaster getMasterMetrics() {
        return metricsMaster;
    }

    @Override
    public ServerManager getServerManager() {
        return null;
    }

    @Override
    public ZKWatcher getZooKeeper() {
        return null;
    }

    @Override
    public CoordinatedStateManager getCoordinatedStateManager() {
        return null;
    }

    @Override
    public ClusterConnection getConnection() {
        return null;
    }

    @Override
    public Configuration getConfiguration() {
        return conf;
    }

    @Override
    public ServerName getServerName() {
        return ServerName.valueOf("mock.master", 12345, 1);
    }

    @Override
    public void abort(String why, Throwable e) {
        //no-op
    }

    @Override
    public boolean isAborted() {
        return false;
    }

    private boolean stopped = false;

    @Override
    public void stop(String why) {
        stopped = true;
    }

    @Override
    public boolean isStopping() {
        return stopped;
    }

    @Override
    public boolean isStopped() {
        return stopped;
    }

    @Override
    public TableDescriptors getTableDescriptors() {
        return null;
    }

    @Override
    public boolean registerService(Service instance) {
        return false;
    }

    @Override
    public boolean abortProcedure(final long procId, final boolean mayInterruptIfRunning) throws IOException {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public List<Procedure<?>> getProcedures() throws IOException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public List<LockedResource> getLocks() throws IOException {
        return null;
    }

    @Override
    public List<TableDescriptor> listTableDescriptorsByNamespace(String name) throws IOException {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public List<TableName> listTableNamesByNamespace(String name) throws IOException {
        return null;
    }

    @Override
    public long deleteTable(final TableName tableName, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long truncateTable(final TableName tableName, final boolean preserveSplits, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }


    @Override
    public long modifyTable(final TableName tableName, final TableDescriptor descriptor, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long enableTable(final TableName tableName, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long disableTable(TableName tableName, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long addColumn(final TableName tableName, final ColumnFamilyDescriptor columnDescriptor, final long nonceGroup,
            final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long modifyColumn(final TableName tableName, final ColumnFamilyDescriptor descriptor, final long nonceGroup,
            final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long deleteColumn(final TableName tableName, final byte[] columnName, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long mergeRegions(final RegionInfo[] regionsToMerge, final boolean forcible, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public long splitRegion(final RegionInfo regionInfo, final byte[] splitRow, final long nonceGroup, final long nonce) throws IOException {
        return -1;
    }

    @Override
    public TableStateManager getTableStateManager() {
        return mock(TableStateManager.class);
    }

    @Override
    public boolean isActiveMaster() {
        return true;
    }

    @Override
    public boolean isInitialized() {
        return false;
    }

    @Override
    public boolean isInMaintenanceMode() {
        return false;
    }

    @Override
    public long getLastMajorCompactionTimestamp(TableName table) throws IOException {
        return 0;
    }

    @Override
    public long getLastMajorCompactionTimestampForRegion(byte[] regionName) throws IOException {
        return 0;
    }

    @Override
    public ClusterSchema getClusterSchema() {
        return null;
    }

    @Override
    public ClusterConnection getClusterConnection() {
        return null;
    }

    @Override
    public LoadBalancer getLoadBalancer() {
        return null;
    }

    @Override
    public FavoredNodesManager getFavoredNodesManager() {
        return null;
    }

    @Override
    public SnapshotManager getSnapshotManager() {
        return null;
    }

    @Override
    public MasterProcedureManagerHost getMasterProcedureManagerHost() {
        return null;
    }

    @Override
    public boolean isSplitOrMergeEnabled(MasterSwitchType switchType) {
        return false;
    }

    @Override
    public long addReplicationPeer(String peerId, ReplicationPeerConfig peerConfig, boolean enabled) throws ReplicationException {
        return 0;
    }

    @Override
    public long removeReplicationPeer(String peerId) throws ReplicationException {
        return 0;
    }

    @Override
    public long enableReplicationPeer(String peerId) throws ReplicationException, IOException {
        return 0;
    }

    @Override
    public long disableReplicationPeer(String peerId) throws ReplicationException, IOException {
        return 0;
    }

    @Override
    public ReplicationPeerConfig getReplicationPeerConfig(String peerId) throws ReplicationException, IOException {
        return null;
    }

    @Override
    public long updateReplicationPeerConfig(String peerId, ReplicationPeerConfig peerConfig) throws ReplicationException, IOException {
        return 0;
    }

    @Override
    public List<ReplicationPeerDescription> listReplicationPeers(String regex) throws ReplicationException, IOException {
        return null;
    }

    @Override
    public LockManager getLockManager() {
        return null;
    }

    @Override
    public String getRegionServerVersion(ServerName sn) {
        return "0.0.0";
    }

    @Override
    public void checkIfShouldMoveSystemRegionAsync() {
    }

    @Override
    public String getClientIdAuditPrefix() {
        return null;
    }

    @Override
    public ProcedureEvent<?> getInitializedEvent() {
        return null;
    }

    @Override
    public FileSystem getFileSystem() {
        return null;
    }

    @Override
    public Connection createConnection(Configuration conf) throws IOException {
        return null;
    }

    @Override
    public ReplicationPeerManager getReplicationPeerManager() {
        return null;
    }

    @Override
    public boolean isClusterUp() {
        return true;
    }

    @Override
    public List<RegionPlan> executeRegionPlansWithThrottling(List<RegionPlan> plans) {
        return null;
    }

    @Override
    public void runReplicationBarrierCleaner() {
    }
}
